#ifndef	_J_PROCESI_H_
#define	_J_PROCESI_H_

#include "dretve.h"
#include "spremnik.h"
#include "stranicenje.h"

inline uint j_velicina_opisnika_procesa ();

inline void j_postavi_opisnike_procesa ( void *opisnici_za_procese );

int j_stvori_proces ( void *param );
int j_zavrsi_proces ( void *param );

//poziva se pri stvaranju nove dretve
void j_proces_postavi_dretvu (  void *opd, int id_procesa, void *stog,
			        void *pokreni_dretvu,
			        void *poc_funkc, void *param );

//gotovu dretvu makni iz popisa procesa
void j_makni_dretvu_procesu ( int id_procesa, void *_opd );

//dohvati opisnik spremnika za proces
void *j_oppr_spremnik ( int id );
void *j_oppr_arh_spremnik ( int id );

//pretvori u adresu za adresni prostor procesa
void *j_jup ( int id_procesa, void *adr_u_jezgri );

//pretvori u adresu za adresni prostor jezgre
void *j_puj ( int id_procesa, void *adr_u_programu );

//test
void proces_x ( void *param );

#if defined ( _J_PROCESI_C_ )

//opisnik procesa
typedef struct _j_proces_t_ {
	int id; //identifikacijski broj procesa
	uint zast; //razne zastavice
	//bool u_jezgri;	//radi u jezgrinom nacinu rada (razina 0)?
	//bool stranicenje; //koristi li stranicenje?

	j_dretva_t *dretva;	//prva dretva u procesu (ostale su u listi2)
				//kad zadnja ode obrisi proces

	j_spremnik_t spremnik;	//opisnik spremnickog prostora koji proces
				//koristi (i njegove dretve)

} j_proces_t;

#define PROCES_JEZGRE	( 1 << 0  ) //radi u jezgrinom nacinu rada (razina 0)?
#define	STRANICENJE	( 1 << 1  ) //koristi li stranicenje?
#define	GASI_SE		( 1 << 31 ) //u postupku gasenja? (sprijeciti rekurziju)

typedef j_proces_t *j_proces_p;

#else //_J_PROCESI_C_



#endif	/* _J_PROCESI_C_ */
#endif	/* _J_PROCESI_H_ */
